#include <stdio.h>  //for NULL
#include <stdlib.h> // for malloc
#include <string.h> //for memset
#include "stack.h"

// return STACK_FAIL if malloc error
int init(stack_t *stackPtr, int size) {
    if (size > 0) {
        stackPtr->elements = (int *)malloc(size*sizeof(int));
        if (stackPtr->elements == NULL) return STACK_FAIL;

        memset(stackPtr->elements, -1, size*sizeof(int));
        stackPtr->sp = -1;
        stackPtr->size = size;
        
        return STACK_OK;
    }
    return STACK_FAIL;
} 

//return 1 if stack is full
int isFULL(stack_t *stackPtr) {
    return (stackPtr->sp >= (int) (stackPtr->size-1));  
}  

// return 1 if stack is empty
int isEmpty(stack_t *stackPtr){ 
    return (stackPtr->sp < 0);
}


//return STACK_FULL if error
int push(stack_t *stackPtr, int x) {
    if (!isFULL(stackPtr)) {
        stackPtr->sp++;
        stackPtr->elements[stackPtr->sp] = x; 
        return STACK_OK;
    }
    return STACK_FULL;
}

// retVaule =  top of stack and return STACK_OK if stack is not empty, 
// otherwise return STACK_EMPTY
int pop(stack_t *stackPtr, int* retValue) {
    if (!isEmpty(stackPtr)) {
        *retValue = stackPtr->elements[stackPtr->sp];
        stackPtr->sp--;
        return STACK_OK;
    }
    return STACK_EMPTY;
}

// return 1 if x is contained in stack
int isExist(stack_t *stackPtr, int x) {
    for (int i = 0; i <= stackPtr->sp; i++)
        if (stackPtr->elements[i] == x) 
            return 1;
    return 0;
}